import { App } from "../../../src/App";
import { Singleton } from "../../../src/core/Class";
import Map from "../../../src/core/Map";


// 道具类型
export enum PropType{
    unknow=-1,
    routine,        // 常规道具(仅仅展示类，没有特别用途)
    ticket,         // 票券类(货币型)，积分(金币)卡、兑换卡、钻石卡、VIP卡、比赛券等
    gift,           // 礼包
    interactive,    // 交互
    game,           // 游戏相关,比如记牌器
    decorate,       // 妆扮类
    debris,         // 合成类道具(碎片型，类似七龙珠的概念)
    money,          // 积分\钻石
    max
}

// 获取类型
enum ObtainType{
    default=0,      // 缺省方式，为游戏中的第一货币(积分或者金币)
    jewel,          // 钻石(宝石)为系统第二货币
    ticket,         // 各种券(兑换券、节日卡等)获取
    give,           // 赠送(系统或者其他渠道)可以明确的溯源和绑定特性
    max
}

// 礼包
interface Gift{
    id:number,
    count:number,
}

// 道具属性
export interface PropAttribute{
    id:number,          // 
    name:string,        // 名字
    icon:string,        // 图标
    sound:string,       // 使用时候绑定的音效
    animation:string,   // 使用时候绑定的动画 '特效所在目录|...|...' 这里需要根据不同的动画进行配置,龙骨动画
    type:number,        // 道具类型PropType
    gifts:Gift[],       // 礼包内容    物品1|数量1|物品2|数量2....
    canUse:boolean,     // 是否可点击使用
    maxAdd:number,      // 最大叠加数量 -1 无限制
    obtainType:number,  // 获取(购买)类型 ObtainType
    validity:number[],  // 有效期，单位秒，若无限制则为-1
    des:string,         // 描述
}

// 特殊道具ID
export enum SpecialID{
    score=100000,
    diamond=100001,
}
class CPropSys extends Singleton<CPropSys> {
    private _propCfg:Map<number,PropAttribute> = new Map<number,PropAttribute>(); 
    private _iconMap:Map<number,cc.SpriteFrame> = new Map<number,cc.SpriteFrame>();

    protected onInit(){
        App.CSV.load(`csv/prop:${App.MOD_NAME.MASTER}`,(datas:any[])=>{
            datas && datas.forEach((it)=>{
                let array = [];
                if (it.type === PropType.gift && (it.subs && it.subs.length > 0)){
                    for (let i = 0; i < it.subs.length;i+=2){
                        array.push({
                            id:parseInt(it.subs[i]),
                            count:parseInt(it.subs[i+1])
                        });
                    }
                } else array = null;
                
                const tmp:PropAttribute = {
                    id:it.ID,          
                    name:it.name, 
                    icon:it.icon,
                    sound:it.sound,
                    animation:it.animation,
                    type:it.type,
                    gifts:array,
                    maxAdd:it.maxAdd,
                    canUse:it.canUse || false,
                    validity:[],
                    obtainType:it.obtainType,
                    des:it.des,
                };
                this._propCfg.inset(it.ID,tmp);
            });
        });
    }

    protected onDestroy(){
        this._iconMap.clear();
        this._propCfg.clear();
        cc.log('destroy prop system end.');
    }

    public setIcon(id:number, target:cc.Node|cc.Sprite){  
        let _sprite:cc.Sprite = null;
        if (target instanceof cc.Node){
            _sprite = target.addComponent(cc.Sprite);
        }
        if (target instanceof cc.Sprite){
            _sprite = target;
        }
        if (App.Util.isInvalid(_sprite)){
            cc.warn(`PropSys.setIcon(target is not cc.Node or cc.Sprite)`);
            return ;
        }

        _sprite.spriteFrame = this._iconMap.find(id);
        if (App.Util.isValid(_sprite.spriteFrame)) return ;

        const cfg = this._propCfg.find(id);
        if (App.Util.isValid(cfg)){
            App.Res.loadRes(`icon/${cfg.icon}:${App.MOD_NAME.MASTER}`,cc.Texture2D,(res:cc.Texture2D)=>{
                const img = new cc.SpriteFrame(res)
                _sprite.spriteFrame = img;
                this._iconMap.inset(id,img);
            });
        }
    }

    public getAttributeByID(id:number):PropAttribute{ return this._propCfg.find(id); }
}

const PropSys:CPropSys = CPropSys.getInstance<CPropSys>(CPropSys);
export default PropSys;
